#ifndef AUDIO_PROCESSOR_H
#define AUDIO_PROCESSOR_H

#include <esp_afe_sr_models.h>  // ESP语音前端处理模型
#include <freertos/FreeRTOS.h>  // FreeRTOS核心头文件
#include <freertos/task.h>      // FreeRTOS任务管理
#include <freertos/event_groups.h>  // FreeRTOS事件组

#include <string>
#include <vector>
#include <functional>

#include "audio_codec.h"  // 音频编解码器接口

/**
 * @brief 音频处理器类
 * 
 * 负责音频信号的前端处理，包括降噪、回声消除、VAD语音活动检测等
 */
class AudioProcessor {
public:
    /**
     * @brief 构造函数
     */
    AudioProcessor();
    
    /**
     * @brief 析构函数
     */
    ~AudioProcessor();

    /**
     * @brief 初始化音频处理器
     * 
     * @param codec 音频编解码器指针
     * @param realtime_chat 是否为实时聊天模式，实时模式会启用回声消除
     */
    void Initialize(AudioCodec* codec, bool realtime_chat);
    
    /**
     * @brief 输入音频数据进行处理
     * 
     * @param data 待处理的音频数据
     */
    void Feed(const std::vector<int16_t>& data);
    
    /**
     * @brief 启动音频处理
     */
    void Start();
    
    /**
     * @brief 停止音频处理
     */
    void Stop();
    
    /**
     * @brief 检查处理器是否正在运行
     * 
     * @return 如果处理器正在运行返回true，否则返回false
     */
    bool IsRunning();
    
    /**
     * @brief 设置处理后音频输出回调
     * 
     * @param callback 处理后音频数据的回调函数
     */
    void OnOutput(std::function<void(std::vector<int16_t>&& data)> callback);
    
    /**
     * @brief 设置VAD状态变化回调
     * 
     * @param callback VAD状态变化的回调函数，speaking为true表示检测到语音
     */
    void OnVadStateChange(std::function<void(bool speaking)> callback);
    
    /**
     * @brief 获取每次Feed所需的数据大小
     * 
     * @return 每次Feed所需的采样点数
     */
    size_t GetFeedSize();

private:
    EventGroupHandle_t event_group_ = nullptr;  // 事件组句柄，用于任务同步
    esp_afe_sr_iface_t* afe_iface_ = nullptr;   // ESP AFE接口
    esp_afe_sr_data_t* afe_data_ = nullptr;     // ESP AFE数据
    std::function<void(std::vector<int16_t>&& data)> output_callback_;  // 处理后音频输出回调
    std::function<void(bool speaking)> vad_state_change_callback_;      // VAD状态变化回调
    AudioCodec* codec_ = nullptr;  // 音频编解码器
    bool is_speaking_ = false;     // 当前是否检测到语音

    /**
     * @brief 音频处理任务函数
     * 
     * 在单独的线程中运行，负责音频数据的实际处理
     */
    void AudioProcessorTask();
};

#endif
